package com.ztesoft.book.admin.controller.sys;

import cn.hutool.core.util.RandomUtil;
import cn.hutool.core.util.StrUtil;
import com.ztesoft.book.admin.controller.base.BaseController;
import com.ztesoft.book.common.constant.Constant;
import com.ztesoft.book.common.utils.Result;
import com.ztesoft.book.common.utils.exception.ExUtil;
import com.ztesoft.book.common.utils.exception.ServiceException;
import com.ztesoft.book.common.utils.validator.ValidatorUtils;
import com.ztesoft.book.core.sys.sysrole.dto.SysRoleDTO;
import com.ztesoft.book.core.sys.sysrole.qo.SysRoleQO;
import com.ztesoft.book.core.sys.sysrole.service.SysRoleService;
import com.ztesoft.book.core.sys.sysuser.dto.SysUserDTO;
import com.ztesoft.book.core.sys.sysuserrole.service.SysUserRoleService;
import lombok.extern.slf4j.Slf4j;
import org.apache.shiro.authz.annotation.Logical;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import java.util.List;

/**
 * @Description 角色
 * @Author wsh
 * @Date 2021-06-30 14:39
 */
@Slf4j
@RestController
@RequiresPermissions("role:")
@RequestMapping("/sys/role")
public class SysRoleController extends BaseController<SysRoleService, SysRoleDTO, SysRoleQO> {

    @Resource
    private SysRoleService sysRoleService;

    @Resource
    private SysUserRoleService sysUserRoleService;

    @Override
    protected SysRoleService getService() {
        return sysRoleService;
    }

    /**
     * 查找自己可见的权限列表
     */
    @PostMapping("/getMyList")
    @RequiresPermissions("list")
    public Result getMyList(@RequestBody List<String> roleIdList) {
        try {
            List<SysRoleDTO> list = this.getService().getMyList(roleIdList);
            return Result.success(list);
        }
        catch (Exception ex) {
            log.error(ex.getMessage());
            return Result.error("获取失败！");
        }
    }

    /**
     * 方法功能描述:
     * < 新增角色 >
     *
     * @param sysRoleDTO 【参数 1 注释说明】
     * @return Result                        【返回值 注释说明】
     * @author wsh
     * @date 2021-06-30 14:39
     */
    @PostMapping("/add")
    @RequiresPermissions("save")
    public Result add(@RequestBody SysRoleDTO sysRoleDTO) {
        // 校验表单数据
        ValidatorUtils.validateEntity(sysRoleDTO);
        // 系统自动生成个CODE
        sysRoleDTO.setRoleCode(Constant.ROLE + RandomUtil.randomInt(100000, 999999));
        // 判断当前帐号是否存在
        SysRoleQO param = new SysRoleQO();
        param.setRoleCode(sysRoleDTO.getRoleCode());
        SysRoleDTO roleTemp = sysRoleService.findOne(param);
        if (roleTemp != null) {
            // 如果重复则位数进1，在新区间随机，再次重复的几率在百万分级，可以近似认为不会重复
            sysRoleDTO.setRoleCode(Constant.ROLE + RandomUtil.randomInt(1000000, 9999999));
        }
        SysUserDTO shiroUser = getShiroUser();
        boolean b = sysRoleService.save(sysRoleDTO);
        if (!b) {
            throw new ServiceException("新增角色失败！");
        }
        return Result.success("新增角色成功！", sysRoleDTO);
    }

    /**
     * 方法功能描述:
     * < 修改角色 >
     *
     * @param sysRoleDTO 【参数 1 注释说明】
     * @return Result                        【返回值 注释说明】
     * @author wsh
     * @date 2021-06-30 14:39
     */
    @PostMapping("/update")
    @RequiresPermissions("update")
    public Result update(@RequestBody SysRoleDTO sysRoleDTO) {
        // 校验表单数据
        ValidatorUtils.validateEntity(sysRoleDTO);
        ExUtil.checkArgument(StrUtil.isNotBlank(sysRoleDTO.getId()), "id不能为空");
        try {
            sysRoleService.updateById(sysRoleDTO);
            return Result.success("修改成功！");
        }
        catch (ServiceException ex) {
            return Result.error(ex.getMessage());
        }
        catch (Exception ex) {
            log.error(ex.getMessage());
            return Result.error("修改失败！");
        }
    }

    /**
     * 方法功能描述:
     * < 删除角色 >
     *
     * @param sysRoleDTO 【参数 1 注释说明】
     * @return Result     Result
     * @author wsh
     * @date 2021-06-30 14:39
     */
    @PostMapping("/delete")
    @RequiresPermissions("delete")
    public Result delete(@RequestBody SysRoleDTO sysRoleDTO) {
        // 校验表单数据
        ExUtil.checkArgument(StrUtil.isNotBlank(sysRoleDTO.getId()), "id不能为空");
        try {
            int count = sysUserRoleService.countRoleUser(sysRoleDTO.getId());
            if (count > 0) {
                return Result.error("当前有在使用该角色的用户，无法删除");
            }
            SysRoleDTO dto = new SysRoleDTO();
            dto.setId(sysRoleDTO.getId());
            sysRoleService.fakeDeleteByPrimaryKey(dto.getId());
            return Result.success("删除成功！");
        }
        catch (ServiceException ex) {
            return Result.error(ex.getMessage());
        }
        catch (Exception ex) {
            log.error(ex.getMessage());
            return Result.error("删除失败！");
        }
    }
}
